package recolhalixo;

import java.util.Collection;
import java.util.LinkedList;
import java.util.Map;

import jadex.bdi.runtime.IBeliefbase;
import jadex.commons.SimplePropertyObject;
import jadex.extension.envsupport.environment.IEnvironmentSpace;
import jadex.extension.envsupport.environment.ISpaceAction;
import jadex.extension.envsupport.environment.ISpaceObject;
import jadex.extension.envsupport.environment.space2d.Grid2D;
import jadex.extension.envsupport.environment.space2d.Space2D;
import jadex.extension.envsupport.math.IVector2;
import jadex.extension.envsupport.math.Vector2Int;

public class AccaoRecolher extends SimplePropertyObject implements ISpaceAction {

	@Override
	public Object perform(Map parameters, IEnvironmentSpace space) {
		
		Object oid = parameters.get(ISpaceAction.OBJECT_ID);
		ISpaceObject camiao = space.getSpaceObject(oid);
		String tipo=(String) camiao.getProperty("type");
		IVector2 myPos = (IVector2) camiao.getProperty("position");
		int px=myPos.getXAsInteger();
		int py=myPos.getYAsInteger();
		Vector2Int pCima=new Vector2Int(px,py-1);
		Vector2Int pBaixo=new Vector2Int(px,py+1);
		Vector2Int pEsquerda=new Vector2Int(px-1,py);
		Vector2Int pDireita=new Vector2Int(px+1,py);

		Grid2D env=(Grid2D) space;
		Collection<ISpaceObject> caixotes=new LinkedList<ISpaceObject>();
		if (env.getSpaceObjectsByGridPosition(pCima, "caixote")!=null) {
			caixotes.addAll(env.getSpaceObjectsByGridPosition(pCima, "caixote"));
		}
		if (env.getSpaceObjectsByGridPosition(pBaixo, "caixote")!=null) {
			caixotes.addAll(env.getSpaceObjectsByGridPosition(pBaixo, "caixote"));
		}
		if (env.getSpaceObjectsByGridPosition(pEsquerda, "caixote")!=null) {
			caixotes.addAll(env.getSpaceObjectsByGridPosition(pEsquerda, "caixote"));
		}
		if (env.getSpaceObjectsByGridPosition(pDireita, "caixote")!=null) {
			caixotes.addAll(env.getSpaceObjectsByGridPosition(pDireita, "caixote"));
		}
		
		Integer recolhido=new Integer(0);
		
		for (ISpaceObject caixote:caixotes) {
			if (caixote.getProperty("type").equals(tipo)) {
				int qtdCaixote=(Integer) (caixote.getProperty("quantity"));
				int qtdCamiao=(Integer) (parameters.get("quantity"))+recolhido;
				int capCamiao=(Integer) (parameters.get("capacity"));
				
				if (qtdCaixote+qtdCamiao<capCamiao) {
					recolhido+=qtdCaixote;
					caixote.setProperty("quantity", 0);
					camiao.setProperty("collected", (Integer)camiao.getProperty("collected")+qtdCaixote);
					//beliefs.getBelief("quantity").setFact(new Integer(qtdCaixote+qtdCamiao));
				}
			}
		}
		return recolhido;
	}
	
	public Object getId()
	{
		return "recolher";
	}

}
